package persistencia.dao;

import java.util.List;

import org.hibernate.Query;

import persistencia.hbt.HibernateUtil;
import bean.Cliente;
import bean.EntidadPersistente;
import bean.ProductoEntregado;
import bean.RemitoCliente;

@SuppressWarnings("unchecked")
public class RemitoClienteDAO extends EntidadPersistenteDAO {
	private static RemitoClienteDAO instancia = null;
	
	public static RemitoClienteDAO getInstancia(){
		if(instancia == null)
			instancia = new RemitoClienteDAO();
		
		if (session == null)
			session = HibernateUtil.getSession();
		
		return instancia;
	}
	
	public RemitoCliente buscar(EntidadPersistente entidad)
	{
		RemitoCliente rem = (RemitoCliente) entidad;
		
		if (rem.getId() != null)
			return (RemitoCliente) super.buscar(rem);
		else if (rem.getNumeroRemito() != null && rem.getCliente() != null)
			return this.buscar(rem.getNumeroRemito(), rem.getCliente());
		
		return null;
	}
	
	private RemitoCliente buscar(Integer numeroRemito, Cliente cliente){
		Query query = session.createQuery(" from RemitoCliente r where r.numeroRemito = :num and r.cliente = :cli");
		query.setInteger("num", numeroRemito);
		query.setEntity("cli", cliente);
		
		RemitoCliente r = (RemitoCliente) query.setFirstResult(0).setMaxResults(1).uniqueResult();
		return r;
	}

	public Integer obtenerMayorNumeroDeRemito()
	{
		Query query = session.createQuery(" select max(r.numeroRemito) from RemitoCliente r");
		Integer mayorNumero = (Integer) query.setFirstResult(0).setMaxResults(1).uniqueResult();

		return (mayorNumero == null? 0: mayorNumero);
	}
	
	public List<RemitoCliente> buscarRemitosPendientesDeFacturar(){
		Query query = session.createQuery(" from RemitoCliente r where r.fechaEntrega is not null and r.procesado = false ");
		return query.list();
	}
	
	public List<RemitoCliente> buscarRemitosPendientesDeFacturar(String cuit){
		Query query = session.createQuery(" from RemitoCliente r where r.fechaEntrega is not null and r.procesado = false " +
				" and r.cliente.cuit = :cuit");
		query.setString("cuit", cuit);
		return query.list();
	}
	
	public List<ProductoEntregado> buscarProductosEntregadosNoFacturadosParaRemito(Integer numeroRemito){
		Query query = session.createQuery("select pe from RemitoCliente r, ProductoEntregado pe " +
				" where r.fechaEntrega is not null and r.procesado = false " +
				" and pe.remitoCliente = r and pe.facturado = false " +
				" and r.numeroRemito = :numeroRemito ");
		
		query.setInteger("numeroRemito", numeroRemito);
		
		return query.list();
	}
}
